import java.util.logging.Logger;

import javax.servlet.http.HttpSession;
import groovyx.gaelyk.logging.GroovyLogger;
import groovyx.gaelyk.routes.RedirectionType;

import org.apache.commons.codec.digest.DigestUtils;
import com.google.appengine.api.datastore.*
import src.de.checker.hochzeit.konstanten.*
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.domain.user.Benachrichtigung;
import src.de.checker.hochzeit.util.*;

import static com.google.appengine.api.datastore.FetchOptions.Builder.*

Logger log = Logger.getLogger('LoginController');

if(params?.login ==~ /(?i)true/)
{
	dologin();
}
if(params?.logout ==~ /(?i)true/)
{
	dologout();
}
if(params?.start ==~ /(?i)true/)
{
	start();
}
if(params?.check ==~ /(?i)true/)
{
	check();
}
private void start()
{
	log.info("IP-Adresse: #" + request.getRemoteAddr()+"#")
	//Benutzer ist noch eingeloggt
	if(session.getAttribute(Konstanten.SESSION_USER) != null)
	{
		createTracer(Konstanten.TRACER_LOGOUT,' (automatisch)')
	    session.user = null;
		 
	}
	session.invalidate();
	redirect "/index/index.gtpl"
}
private void dologout()
{
	
	if(session != null)
	{ 
	  createTracer(Konstanten.TRACER_LOGOUT,'')
	  session.user = null;
	  session.invalidate();
	  
	}
	redirect '/'
}
private void dologin()
{
	long t1 = System.currentTimeMillis();
	String benutzername = params.benutzername
	String psw = DigestUtils.md5Hex(params.passwort)
	
	def query = new Query(Konstanten.GAST)
	query.addFilter("loginname", Query.FilterOperator.EQUAL, benutzername)
	query.addFilter("passwort", Query.FilterOperator.EQUAL, psw)
	
	PreparedQuery preparedQuery = datastore.prepare(query)
	try
	{
		Entity user = preparedQuery.asSingleEntity()
		System.out.println("Login: Benutzer gefunden - "+user)
	
	if(user == null)
    {
		request.setAttribute 'message', 'Zugang unbekannt'
		log.warning("Einloggen fehlgeschlagen [Nutzername: "+benutzername+", IP: "+request.getRemoteAddr()+"]")
		forward '/index/index.gtpl'
    }
    else
    {
    	session.setAttribute Konstanten.SESSION_USER, user
		
//	    //Hochzeitsdaten suchen und in Session schreiben
	    try
	    {
	    	def queryh = new Query(Konstanten.HOCHZEIT)
			queryh.addFilter("feier", Query.FilterOperator.EQUAL, user.feier)
			PreparedQuery preparedQueryh = datastore.prepare(queryh)
			Entity hochzeit = preparedQueryh.asSingleEntity()
			session.setAttribute Konstanten.SESSION_HOCHZEIT, hochzeit
    	}
	    catch(Exception e){
	    	System.out.println("Probleme beim suchen der Hochzeit "+user.feier)
	    	e.printStackTrace()
	    }
//	    //Anprechpartner suchen und in Session schreiben
	    try
		{
			def query1 = new Query(Konstanten.ANPRECHPARTNER)
			query1.addFilter("feier", Query.FilterOperator.EQUAL, user.feier)
			PreparedQuery preparedQuery1 = datastore.prepare(query1)
			def entities = preparedQuery1.asList( withLimit(20) )
			System.out.println("resultclass: "+entities.getClass())
			List tmp = new ArrayList()
			for(i in entities) {
				tmp.add(i)
			}
			session.setAttribute Konstanten.SESSION_ANSP, tmp
		}
		catch(Exception e){
			System.out.println("Probleme beim suchen der Ansprechpartner "+user.feier)
			e.printStackTrace()
		}
		createTracer(Konstanten.TRACER_LOGIN,'')
		
		//Wenn der Benutzer die Rolle Brautpaar hat, überprüfen ob bereits Objekte für die
		//Benachrichtigung bestehen
		if(user.rolle == 0)
		{
			createbenachr(user)
		}
	    if(user.rolle == 1)
		{
			if(user.benAngelegt == null || !user.benAngelegt)
			{
				createbenachrPlaner(user)
			}
		}
	    long t2 = System.currentTimeMillis();
	    System.out.println("Dauer login: "+(t2-t1))
	    redirect '/home/index.gtpl'
       
    }
	}
	catch(Exception e)
	{
		log.warning(e.toString())
		request.message = 'Es gibt Probleme mit dem Zugang. Bitte wende dich an checkerdev@googlemail.com'
		forward '/index/index.gtpl'
	}
	
}
private void createbenachrPlaner(Entity user)
{
	Key userkey = user.key 
	def query = new Query(Konstanten.BENACHRICHTIGUNG)
	query.addFilter("gast", Query.FilterOperator.EQUAL, userkey)
	PreparedQuery preparedQuery = datastore.prepare(query)
	def entities = preparedQuery.asList( withLimit(1) )
	if(entities == null || entities.size() == 0)
	{
		log.info("Neue Benachrichtigungen anlegen für "+userkey+ " (Hochzeitsplaner)")
		
		Benachrichtigung b = new Benachrichtigung()
		b.gast = userkey
		b.wert = true
		b.typ = new Long(6)
		b.tage = new Long(7)
			
		Entity e2 = b as Entity
		e2.save()
			
		log.info("Benachrichtigung anlegt: 6")
		user.benAngelegt = true
		user.save()
	
	}
}

private void createbenachr(Entity user)
{
	Key userkey = user.key 
	def query = new Query(Konstanten.BENACHRICHTIGUNG)
	query.addFilter("gast", Query.FilterOperator.EQUAL, userkey)
	PreparedQuery preparedQuery = datastore.prepare(query)
	def entities = preparedQuery.asList( withLimit(6) )
	if(entities == null || entities.size() == 0)
	{
		log.info("Neue Benachrichtigungen anlegen für "+userkey+ " (Brautpaar)")
		// 1 = Kontakt, 2 = Adresse, 3 = Zusage, 
		// 4 = UpdateKinder, 5 = UpdateAnhang, 6 = Checkliste
		for(int i = 1; i<7; i++)
		{
			Benachrichtigung b = new Benachrichtigung()
			b.gast = userkey
			b.wert = true
			b.typ = new Long(i)
			b.tage = new Long(7)
			
			Entity e2 = b as Entity
			e2.save()
			
			log.info("Benachrichtigung anlegt: "+i)
		}
		user.benAngelegt = true
		user.save()
	}
}
private void check()
{
	//log.info("PING")
	redirect '/index/index.gtpl'
}
private void createTracer(String type, String message)
{
	try
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);
		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.nachricht = message
	    t.type = type
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		System.out.println("Fehler beim Erstellen eines Tracereintrags "+e.toString())
	}
}       

